home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / comm / msged400.zip / src / menu.c < prev    next >
C/C++ Source or Header  |  1996-07-22  |  14KB  |  438 lines

  1. /*
  2.  *  MENU.C
  3.  *
  4.  *  Written on 10-Jul-94 by John Dennis and released to the public domain.
  5.  *
  6.  *  Moving bar menu code for Msged.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include "msged.h"
  13. #include "main.h"
  14. #include "keys.h"
  15. #include "strextra.h"
  16.  
  17. void SelShowItem(char *text, int y, int len, int Attr, int indent)
  18. {
  19.     char line[256];
  20.  
  21.     memset(line, ' ', 40);
  22.     strcpy(line + indent, text);
  23.     WPutsn(indent, y, len, Attr, line);
  24. }
  25.  
  26. void SelShowPage(char **text, int top, int bot, int len, int pos, int Attr, int indent)
  27. {
  28.     int i;
  29.     int y = top;
  30.  
  31.     for (i = pos; text[i] != NULL; i++)
  32.     {
  33.         if (y > bot)
  34.             break;
  35.  
  36.         SelShowItem(text[i], y++, len, Attr, indent);
  37.     }
  38.     if (y <= bot)
  39.     {
  40.         while (y <= bot)
  41.             SelShowItem(" ", y++, len, Attr, indent);
  42.     }
  43. }
  44.  
  45. void CalcDef(int max, int cur, int *top, int miny, int maxy, int *y)
  46. {
  47.     int dif = maxy - miny;
  48.  
  49.     unused(cur);
  50.     if ((max - 1) - *top < dif && max > dif)
  51.     {
  52.         *y = maxy;
  53.         *top = (max - 1) - dif;
  54.     }
  55. }
  56.  
  57. int SelBox(char **Itms, int y1, int y2, int len, int def, WND * hPrev, WND * hWnd, int Sel, int Norm, int selbox_id, char *topMsg)
  58. {
  59.     EVT e;
  60.     char find[30];
  61.     int itemCnt, Stuff, done, curY, Msg, currItem, Top, page, i;
  62.  
  63.     itemCnt = 0;
  64.     Stuff = 0;
  65.     for (i = 0; Itms[i] != NULL; i++)
  66.         itemCnt++;
  67.  
  68.     if (itemCnt < y2)
  69.     {
  70.         y2 = itemCnt;
  71.     }
  72.     currItem = def;
  73.     curY = y1;
  74.     page = y2 - y1;
  75.     Top = currItem;
  76.  
  77.     if (currItem + y1 < y1)
  78.     {
  79.         curY = y1 + currItem;
  80.         Top = 0;
  81.     }
  82.     else
  83.     {
  84.         if ((itemCnt - currItem) <= (y2 - y1))
  85.         {
  86.             Top -= ((y2 - y1 + 1) - (itemCnt - Top));
  87.             curY = y1 + (def - Top);
  88.             if (Top < 0)
  89.             {
  90.                 Top = 0;
  91.                 curY--;
  92.             }
  93.         }
  94.     }
  95.     done = 0;
  96.  
  97.     SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
  98.     SelShowItem(Itms[currItem], curY, len, Sel, 1);
  99.  
  100.     TTClearQue();               /* clear input queue */
  101.  
  102.     memset(find, '\0', sizeof find);
  103.     while (!done)
  104.     {
  105.         if (*topMsg && selbox_id == SELBOX_REPLYOTH && !*find)
  106.         {
  107.             WCurr(hPrev);
  108.             WClear(strlen(topMsg) + 4, 0, maxx - 33, 0, cm[CM_NINF]);
  109.             WPrintf(0, 0, cm[MN_NTXT], ">>%s:", topMsg);
  110.             WCurr(hWnd);
  111.         }
  112.         if (!Stuff)
  113.         {
  114.             Msg = MnuGetMsg(&e, hWnd->wid);
  115.         }
  116.         else
  117.         {
  118.             e.msgtype = WM_CHAR;
  119.             Msg = Stuff;
  120.             Stuff = 0;
  121.         }
  122.  
  123.         switch (e.msgtype)
  124.         {
  125.         case WM_MOUSE:
  126.             switch (Msg)
  127.             {
  128.             case RMOU_CLCK:
  129.             case MOU_RBTUP:
  130.                 return -1;
  131.  
  132.             case LMOU_RPT:
  133.             case MOU_LBTDN:
  134.                 /* case MOU_LBTUP: */
  135.             case LMOU_CLCK:
  136.                 /* case MOUSE_EVT: */
  137.                 {
  138.                     int x, y;
  139.  
  140.                     WndGetRel(e.x, e.y, &x, &y);
  141.                     if (y >= y1 && y <= y2)  /* in window */
  142.                     {
  143.                         Stuff = 0;
  144.                         if (x >= 0 && x < len)
  145.                         {
  146.                             if (y == curY)
  147.                             {
  148.                                 if (Msg == LMOU_CLCK || Msg == MOU_LBTUP)
  149.                                     return currItem;
  150.                                 else
  151.                                     continue;
  152.                             }
  153.                             SelShowItem(Itms[currItem], curY, len, Norm, 1);
  154.  
  155.                             if (y > curY)
  156.                                 currItem += y - curY;
  157.                             else
  158.                                 currItem -= curY - y;
  159.  
  160.                             curY = y;
  161.  
  162.                             SelShowItem(Itms[currItem], curY, len, Sel, 1);
  163.  
  164.                             if (Msg == LMOU_CLCK || Msg == MOU_LBTUP)
  165.                                 return currItem;
  166.                         }
  167.                     }
  168.                     else
  169.                     {
  170.                         if (Msg != LMOU_CLCK)
  171.                         {
  172.                             if (y < y1)
  173.                             {
  174.                                 Stuff = Key_Up;
  175.                             }
  176.                             else
  177.                             {
  178.                                 Stuff = Key_Dwn;
  179.                             }
  180.                         }
  181.                     }
  182.                 }
  183.                 memset(find, '\0', sizeof find);
  184.                 break;
  185.  
  186.             default:
  187.                 break;
  188.             }
  189.             break;
  190.  
  191.         case WM_CHAR:
  192.             switch (Msg)
  193.             {
  194.             case Key_Home:
  195.                 if (!currItem)
  196.                     break;
  197.                 SelShowItem(Itms[currItem], curY, len, Norm, 1);
  198.                 currItem = 0;
  199.                 Top = 0;
  200.                 curY = y1;
  201.                 SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
  202.                 SelShowItem(Itms[currItem], curY, len, Sel, 1);
  203.                 memset(find, '\0', sizeof find);
  204.                 break;
  205.  
  206.             case Key_End:
  207.                 if (currItem == itemCnt - 1)
  208.                     break;
  209.                 SelShowItem(Itms[currItem], curY, len, Norm, 1);
  210.                 currItem = itemCnt - 1;
  211.                 while (currItem && currItem >= (itemCnt - page))
  212.                     currItem--;
  213.                 Top = currItem;
  214.                 currItem = itemCnt - 1;
  215.                 curY = currItem - Top + y1;
  216.                 CalcDef(itemCnt, currItem, &Top, y1, y2, &curY);
  217.                 SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
  218.                 SelShowItem(Itms[currItem], curY, len, Sel, 1);
  219.                 memset(find, '\0', sizeof find);
  220.                 break;
  221.  
  222.             case Key_Dwn:
  223.                 if (currItem == itemCnt - 1)
  224.                     break;
  225.  
  226.                 SelShowItem(Itms[currItem], curY, len, Norm, 1);
  227.                 currItem++;
  228.                 if (curY == y2)
  229.                 {
  230.                     WScroll(1, y1, len - 1, y2, 1);
  231.                     Top++;
  232.                 }
  233.                 else
  234.                     curY++;
  235.                 SelShowItem(Itms[currItem], curY, len, Sel, 1);
  236.                 memset(find, '\0', sizeof find);
  237.                 break;
  238.  
  239.             case Key_Up:
  240.                 if (!currItem)
  241.                     break;
  242.  
  243.                 SelShowItem(Itms[currItem], curY, len, Norm, 1);
  244.                 currItem--;
  245.                 if (curY == y1)
  246.                 {
  247.                     WScroll(1, y1, len - 1, y2, 0);
  248.  
  249.                     if (Top)
  250.                         Top--;
  251.                 }
  252.                 else
  253.                     curY--;
  254.                 SelShowItem(Itms[currItem], curY, len, Sel, 1);
  255.                 memset(find, '\0', sizeof find);
  256.                 break;
  257.  
  258.             case Key_PgUp:
  259.                 if (!currItem)
  260.                     break;
  261.  
  262.                 SelShowItem(Itms[currItem], curY, len, Norm, 1);
  263.                 if ((currItem -= page) < 0)
  264.                     currItem = 0;
  265.  
  266.                 Top = currItem;
  267.                 curY = y1;
  268.                 SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
  269.                 SelShowItem(Itms[currItem], curY, len, Sel, 1);
  270.                 memset(find, '\0', sizeof find);
  271.                 break;
  272.  
  273.             case Key_PgDn:
  274.                 if (currItem == itemCnt - 1)
  275.                     break;
  276.  
  277.                 SelShowItem(Itms[currItem], curY, len, Norm, 1);
  278.                 Top = currItem;
  279.  
  280.                 if ((currItem += page) > itemCnt - 1)
  281.                     currItem = itemCnt - 1;
  282.  
  283.                 curY = currItem - Top + y1;
  284.                 CalcDef(itemCnt, currItem, &Top, y1, y2, &curY);
  285.                 SelShowPage(Itms, y1, y2, len, Top, Norm, 1);
  286.